﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDelegate
{
    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int ClassId { get; set; }
        public int Age { get; set; }

        /// <summary>
        /// 问好
        /// 传入参数，分辨类型----使用枚举--避免调用方出错；
        /// 不同的类型给不同的逻辑
        /// </summary>
        public void SayHi(UserType userType) //1.   哪儿的人  2 哪儿的人
        {
            Console.WriteLine("招招手~");  //只需要一句代码搞定了
            switch (userType)
            {
                case UserType.Wuhan:
                    Console.WriteLine("吃了么？");
                    break;
                case UserType.BeiJing:
                    Console.WriteLine("你好！");
                    break;
                case UserType.GuangDong:
                    Console.WriteLine("靓仔/靓女~ 雷猴！");
                    break;
                default:
                    throw new Exception("No userType");

            }
        }


        public delegate void DoHandlerDelegate();


        //自上而下比较：逻辑单一，逻辑解耦，职责单一，保证代码的稳定性；

        /// <summary>
        /// 如何写？
        /// 思路：传递参数枚举---分辨不同地方的人----给出不同的业务逻辑-----（传枚举usertype---选择逻辑）----直接传递逻辑呗；   逻辑在哪儿？ 封装成一个方法； 其实就是需要传递一个方法；
        /// 
        /// 问题：如何把方法当做参数来进行传递？？？  啥？？？ 当然是委托；
        /// </summary>
        public void SayHiPerfect(DoHandlerDelegate doHandler)
        {
            Console.WriteLine("保持微笑~~");
            doHandler.Invoke();
        }

        //自下而上比较：去掉重复代码；

        //WuHan 人： 吃了么？
        //GuanDong 人：靓仔/靓女~ 雷猴！
        //BeiJing 人： 你好！


        public void SayShangHai()
        {
            Console.WriteLine("招招手~");
            Console.WriteLine("侬好？");
        }

        public void SayHiWuHan()
        {
            Console.WriteLine("招招手~");
            Console.WriteLine("吃了么？");
        }

        public void SayHiGuanDong()
        {
            Console.WriteLine("招招手~");
            Console.WriteLine("靓仔/靓女~ 雷猴！");
        }

        public void SayHiBeiJing()
        {
            Console.WriteLine("招招手~");
            Console.WriteLine("你好！");
        }

        public void Study()
        {
            Console.WriteLine("学习.net高级班公开课");
        }

        public static void StudyAdvanced()
        {
            Console.WriteLine("学习.net高级班vip课");
        }
    }


    public delegate void SayHiDalegate();


    public enum UserType
    {
        Wuhan = 1,
        GuangDong = 2,
        BeiJing = 3
    }
}
